let obj1 = {
    a: {b: 1}
}

function deepClone(obj) {
    let cloneObj = {}
    for (let key in obj) {                 //遍历
        if (typeof obj[key] === 'object') {
            cloneObj[key] = deepClone(obj[key])  //是对象就再次调用该函数递归
        } else {
            cloneObj[key] = obj[key]  //基本类型的话直接复制值
        }
    }
    return cloneObj
}
/*
这个深拷贝函数并不能复制不可枚举的属性以及 Symbol 类型；

这种方法只是针对普通的引用类型的值做递归复制，而对于 Array、Date、RegExp、Error、Function 这样的引用类型并不能正确地拷贝；

对象的属性里面成环，即循环引用没有解决。
 */
let obj2 = deepClone(obj1);
obj1.a.b = 2;
console.log(obj2);   //  {a:{b:1}}
